package Jordan;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.util.HashMap;


/**
 * Clase que modela una Ficha, planilla de Strings
 * @author jordan
 * @version 0.2
 */
public class FichaInput{
	
	private File archivo;
	private FileReader fl;
	private BufferedReader br;
	private HashMap<String, String> map;
	//private MapList<String , String> map;
	
	/**
	 * Constructor para poder modificar un archivo input
	 * @param fileToRead archivo a modificar, poner ruta absoluta al usar
	 * @throws IOException
	 */
	public FichaInput(File fileToRead) throws IOException {
		archivo=fileToRead;
		try {
			fl=new FileReader(archivo);
			br=new BufferedReader(fl);
			if (br.markSupported()) {
				br.mark((int)archivo.length() * 10);
	        }
//			map=new HashMap<String, String>();
			map=new HashMap<String, String>();
			crearMapeo();
			br.reset();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * No testeado
	 * @return
	 * @throws IOException
	 */
	public String leerlinea() throws IOException{
		
		return br.readLine();			
	}
	
	/**
	public boolean empiesaCon(char[] palabra) throws IOException{
		String aux=br.readLine();
		char[] arr=aux.toCharArray();
		aux="";
		int j=0;
		for(int i=0; i<palabra.length; i++){
			if(arr[i]==palabra[j])
				aux=aux+arr[i];
			else return false;
			j++;
		}
		System.out.println(aux);
		return true;
	}
	
	public void setValue(Object valor) throws IOException{
		String aux=br.readLine();
		char[] arr=aux.toCharArray();
		aux="";
		for(int i=0; i<arr.length; i++)
			if(arr[i]!=':')
				aux=aux+arr[i];
		aux=aux+valor;
	}
	**/
	
	private void crearMapeo() throws IOException{
		String line=br.readLine();
		while(line!=null && line!=""){
			agregarAmapeo(line);
//			System.out.println(line);
			line=br.readLine();
		}
	}
	
	private void agregarAmapeo(String line) {
		String r1=new String("");
		String r2=new String("");
		String[] entrada=conseguirEntrada(r1,r2,line);
map.put(entrada[0], entrada[1]);
				
	}

	private String[] conseguirEntrada(String r1, String r2, String lin) {
//		char[] araux=new char[lin.length()];
		char[] araux=lin.toCharArray();
		int i=0;
		while(araux[i]!=':' && i<araux.length-1){
			r1=r1+araux[i];
//			System.out.println(r1+"%%");
			i++;
		}
		if(i==araux.length-1)
			r1=r1+araux[i];
		if(i<araux.length-1)
			i++;
		while(araux[i]!=';' && araux[i]!=':' && i<araux.length-1){
			r2=r2+araux[i];
//			System.out.println(r2+"&&");
			i++;
		}
//		System.out.println(r1+"\\"+r2);
		return new String[]{r1, r2};
		
	}
	
	
	/**
	 * metodo para setear los atributos
	 * @param atributo String del input atributo
	 * @param value valor a setear al atributo
	 */
	public void set(String atributo, String value){
		map.put(atributo, value);
	}
	
	/**
	 * obtiene el valor string del atributo como parametro
	 * @param atributo atributo a buscar el valor
	 * @return valor del atributo, encerrado por ':' y ';'
	 * @throws InvalidKeyException si la llave es nula tira la excepcion
	 */
	public String get(String atributo) throws InvalidKeyException{
		if(atributo==null)
			throw new InvalidKeyException("atributo nulo");
		return map.get(atributo);
	}
	
	/**
	 * Muestra el mapeo sobre el archivo input
	 */
	public void showmap(){
		System.out.println("Showing map:");
		for(String s: map.keySet()){
			System.out.println(s+":"+map.get(s)+";");
//				System.out.println(map.get(s)+";");
		}
	}
	
	/**
	 * Salva los cambios en la pc
	 * @param place lugar destino donde se guardara el documento
	 * @return el archivo modificado
	 * @throws IOException 
	 */
	public File saveFile(String place) throws IOException{
		File nw=new File(place);
		FileWriter fw=new FileWriter(nw);
		BufferedWriter bw=new BufferedWriter(fw);
		System.out.println("saving file...");
		for(String e: map.keySet()){
			bw.append(e+":"+map.get(e)+";");
			System.out.println(e+":"+map.get(e)+";");
			bw.newLine();
			
		}
		bw.close();
		return nw;
	}
	
	/**
	 * cierra el archivo input, para no poder seguir leyendo mas. aun se puede seguir modificando 
	 */
	public void close(){
		try {
			br.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


}
